#! /usr/bin/env python
# -*- coding: utf-8 -*-

"""
 *
 * Pong Test
 *
 *  - testiranje engine-a
 *
 * Autori: Koki007
 * Verzija: 0.1
 * Datum: 04.01.2011
 *
"""

#import sys
                                        
#import cProfile

import os, pygame
from pygame.locals import *

from DB_engine.engine import cEngine
from DB_engine.stanje import cStanje
from DB_engine.mapa import cMapa
from DB_engine.kamera import cKamera
from DB_engine.objekti import cObjekt, cPokretni_objekt
from DB_engine.gui import cGUI_element, cGUI_upravitelj


# lopta
class cLopta(cPokretni_objekt):

    def __init__(self, engine, x, y, ime_slike):
        cPokretni_objekt.__init__(self, engine, ime_slike, x, y, False, 0)
        self.brzina_x = 4
        self.brzina_y = 4
        self.korisnikove_varijable["broj_odbijanja"] = 0
        self.dodaj_zvuk("odbijanje_igrac", os.path.join("igre", "pong", "odbijanje_igrac.wav") )
        self.dodaj_zvuk("odbijanje_zid", os.path.join("igre", "pong", "odbijanje_zid.wav" ) )
        pass
    
    def azuriraj(self):
        cPokretni_objekt.azuriraj(self)

        rezolucija_x, rezolucija_y = self.engine.provjeri_rezoluciju()
        
        if self.pozicija_x > rezolucija_x:
            self.brzina_x = -self.brzina_x
            self.sviraj_zvuk("odbijanje_zid")
            
        if self.pozicija_x < 0:
            self.brzina_x = -self.brzina_x
            self.sviraj_zvuk("odbijanje_zid")
        #if self.pozicija_y > rezolucija_y: self.brzina_y = -self.brzina_y
        
        if self.pozicija_y < 0:
            self.brzina_y = -self.brzina_y
            self.sviraj_zvuk("odbijanje_zid")

    def odgovor_na_sudar(self, objekt):
        if objekt.je_grupa("igrac"):
            self.brzina_y = -self.brzina_y
            # BUGOVI
            # - mijenja se y kod igrac tresne i sastrane
            # - igrac "preskoci" loptu kad pomakne misa dovoljno daleko
            
            # prati broj odbijanja i azurira GUI element koji to ispisuje
            self.korisnikove_varijable["broj_odbijanja"] += 1
            self.engine.upravitelj_stanja.stanje("glavno").GUI.element("brojac").promijeni_atribute(tekst = "Broj odbijanja: " + str(self.korisnikove_varijable["broj_odbijanja"]))
            self.sviraj_zvuk("odbijanje_igrac")
        
# glavno (in_game) stanje u igri
class glavno_stanje(cStanje):
    def __init__(self, upravitelj, engine, ime):
        cStanje.__init__(self, upravitelj, engine, ime)
        
        self.ucitaj_pozadinu( os.path.join("igre", "pong", "planet-earth-in-space.jpg") )
        
        self.glavna_mapa = cMapa(engine)
        self.glavna_mapa.dodaj_sloj("glavni_sloj",1)

        self.lopta = cLopta(engine ,300, 300, os.path.join("igre", "pong", "lopta.bmp") )
        self.glavna_mapa.dodaj_objekt("glavni_sloj", self.lopta)
        
        self.igrac = cPokretni_objekt(engine ,os.path.join("igre", "pong", "pong.bmp"), 300, self.engine.provjeri_rezoluciju()[1] - 20)
        self.igrac.postavi_grupu("igrac")
        self.glavna_mapa.dodaj_objekt("glavni_sloj", self.igrac)

        self.kamera = cKamera(self.engine.provjeri_rezoluciju(), engine.glavni_buffer )
        self.kamera.fokusiraj_na_centar()

        self.upravitelj_stanja.varijable["igra_pokrenuta"] = True
        
        self.GUI = cGUI_upravitelj()
        element = self.GUI.dodaj_element("brojac", cGUI_element(500, 20, 180, 30, tekst = "Broj odbijanja: ", pozadina_boja = (0, 0, 0), transparentna_boja = (0, 0, 0) ) )
        element.postavi_atribute("na_kursoru", font_boja = (255, 0, 0), pozadina_boja = (0, 0, 0), tekst = "Broj odbijanja: ")
        print "Inicijalizirano glavno stanje"
        pass
        
        
    def primi_event(self, event):
        if event.type == MOUSEMOTION:
            mis_x, mis_y = event.pos
            self.igrac.postavi_poziciju(mis_x, self.engine.provjeri_rezoluciju()[1] - 20)
            
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                self.upravitelj_stanja.aktiviraj_stanje("menu")        
                
        self.GUI.primi_event(event)
        pass
        
        
    def azuriraj(self):
        self.glavna_mapa.azuriraj()
        pass
        
        
    def crtaj(self):
        cStanje.crtaj(self)
        #engine.glavni_buffer.fill((0, 0, 0))
        self.kamera.crtaj_mapu(self.glavna_mapa, "glavni_sloj", engine.glavni_buffer)
        self.GUI.crtaj(engine.glavni_buffer)
        pass

        
        
class cStanje_menu(cStanje):
    def __init__(self, upravitelj, engine, ime):
        cStanje.__init__(self, upravitelj, engine, ime)
        self.ucitaj_pozadinu( os.path.join("igre", "pong", "background-clip-art-blue.jpg") )
        self.GUI = cGUI_upravitelj()
        
        # datoteka zvuka za klik na gumb
        zvuk_GUI_klik = os.path.join("igre", "pong", "GUI_klik.wav")
        zvuk_GUI_nakursoru = os.path.join("igre", "pong", "GUI_kursor.wav")
        
        # Gumb "Nova igra"
        element = self.GUI.dodaj_element("Nova igra", cGUI_element(350, 200, 120, 30, tekst = "Nova igra", zvuk_na_kursoru = zvuk_GUI_nakursoru) )
        element.postavi_atribute("na_kursoru", font_boja = (255, 0, 255), tekst = "Nova igra", zvuk_klik = zvuk_GUI_klik)
        element.na_klik( "lijevi", self.novo_glavno_stanje )
        
        # Gumb "Nastavi igru"
        element = self.GUI.dodaj_element("Nastavi", cGUI_element(350, 250, 120, 30, tekst = "Nastavi igru", zvuk_na_kursoru = zvuk_GUI_nakursoru) )
        element.postavi_atribute("na_kursoru", font_boja = (255, 0, 255), tekst = "Nastavi igru")
        element.postavi_atribute("neaktivan", pozadina_boja = (50, 50, 50), font_boja = (70, 70, 70), tekst = "Nastavi igru")
        element.na_klik( "lijevi", self.upravitelj_stanja.aktiviraj_stanje, "glavno" )
        element.deaktiviraj()
        
        # Gumb "Izlaz"
        element = self.GUI.dodaj_element("Izlaz", cGUI_element(350, 300, 120, 30, tekst = "Izlaz", zvuk_na_kursoru = zvuk_GUI_nakursoru) )
        element.postavi_atribute("na_kursoru", pozadina_boja = (255, 0, 255), font_velicina = 34, tekst = "Izlaz")
        element.na_klik( "lijevi", self.engine.izlaz )
        
        
    def primi_event(self, event):
        self.GUI.primi_event(event)
        pass
        
        
    def azuriraj(self):
        self.GUI.azuriraj()
        pass
        
        
    def crtaj(self):
        cStanje.crtaj(self)
        self.GUI.crtaj(engine.glavni_buffer)
        
    # poziva se svaki puta kada se aktivira stanje
    def stanje_aktivirano(self):
        self.engine.glavni_buffer.fill( (0,0,0) )
        if self.upravitelj_stanja.varijable["igra_pokrenuta"] == True:
            self.GUI.element("Nastavi").aktiviraj()
        #else: self.GUI.element("Nastavi").deaktiviraj()
        
    def novo_glavno_stanje(self):
        self.engine.upravitelj_stanja.dodaj_stanje("glavno", glavno_stanje)
        self.engine.upravitelj_stanja.aktiviraj_stanje("glavno")
        
# pocetak main-a
engine = cEngine(800, 600, 60)
engine.upravitelj_stanja.varijable["igra_pokrenuta"] = False
#engine.upravitelj_stanja.dodaj_stanje("glavno", glavno_stanje)
engine.upravitelj_stanja.dodaj_stanje("menu", cStanje_menu)
engine.upravitelj_stanja.aktiviraj_stanje("menu")
engine.pokreni()
#cProfile.run('engine.pokreni()')


                              
     

